# unbricker

Небольшой скрипт на Python предназначен для раскирпичивания микроконтроллеров CH32V003.


## Описание проблемы

Микроконтроллер типа CH32V003J4M6 выпускается в корпусе SOP8, у которого всего 8 выводов. Почти все ноги имеют двойное-, тройное и даже больше назначение.

Так например, на ножку 8 выведены сигналы сразу с трёх контактных площадок кремниевого чипа. При грамотном их использовании эти сигналы друг другу не мешают и, соответственно, не приводят к каким-либо фатальным последствиям.
Более того, этот же вывод используется для управления микроконтроллером со стороны программатора, то есть для программирования и других задач.

Программист-разработчик может смело использовать этот вывод в качестве входа для портов PD1, PD4, PD5, а также с может использовать в качестве входа альтернативных функций, совмещённых с этими портами, если эти функции входа.

Проблема возникает, если этот вывод использовать в качестве выхода названных портов или альтернативных функций, подразумевающих выход.

Почему? Да потому, что если программист определит ножку на выход, то программатор уже не сможет "достучаться" через неё до микроконтроллера.

Понятно, что такое происходит тогда, когда программатор пытается обратится к микроконтроллеру. Тут следует заметить, что "непродуманная" программа, которая переводит ножку на выход, переключает ножку на выход на сразу после снятия сигнала сброс, а через некоторое время.

Сначала микроконтроллеру нужно настроить стек, проинициализировать тактовую систему, проинициализировать переменные в памяти и так далее. На это уходит какое-то время. Несколько десятков (а может и сотню-другую) микросекунд. Но это всё равно очень малое время, значительно меньшее, чем скорость реакции человека.

Учитывая, что у микроконтроллера CH32V003J4M6 отсутствует вывод (ножка на корпусе) для сигнала NRST, ситуация становится вообще плачевная. Ведь единственный сигнал сброса, которым можно хоть как-то управлять микроконтроллером, осуществляется внутренней схемой POR/PDR. И в результате получается так, что нужно очень сильно исхитрится, чтобы после подачи питания на микроконтроллер суметь внутри этих десятков микросекунд обратиться к микроконтроллеру программатором. Задача не то, чтобы из разряда нелёгких, скорее даже из разряда невыполнимых руками человека.

Поэтому на практике у программистов иногда случается случайно "окирпичить" этот микроконтроллер.


## Работа скрипта

Скрипт написан на Python. Обкатка и проверка осуществлялись на Линуксе (Debian). Поскольку Python кросс-платформенный, то, я думаю, что скрипт под Виндовсом тоже должен работать. (Хотя, если честно, то я не проверял.)

Для раскирпичивания нужно всё соединить как обычно: компьютер, программатор и микроконтроллер. Ничего дополнительного делать не надо. Скрипт -- это консольная программа, которая работает в терминальном окне, поэтому запускается одной командой:

```code
$ unbricker.py
```

Через секунду-две, а в некоторых случая и быстрее, микроконтроллер будет раскирпичен.

**ВНИМАНИЕ!**
_На всякий случай напоминаю, что процесс раскирпичивания очищает флешь и снимет защиты от её считывания._


## Предустановка необходимого программного обеспечения

Сейчас я говорю про Линукс. Про Виндовс ничего не скажу, я, можно сказать, его не знаю совсем.

В целом для работы раскирпичивателя нужен сам Python и три дополнительных к нему пакета:

- pyusb
- pyserial
- hid

Python на компах с Линуксом обычно уже установлен, поэтому всё, что необходимо сделать -- это проинсталлировать три пакета.

```code
$ pip3 install pyusb pyserial hid -U
```

В конце команды находится ключик -U (вместо него можно написать --uprgade). Если у вас на компе уже установлены эти пакеты, то этот ключик позволит их проапгрейдировать.

Бывают случаи (редко, но иногда я сталкиваюсь с этим), что на копме отсутствует питоновский установщик pip. Если что, то установить его можно командой:

```code
python3 -m pip install --upgrade pip
```

## Про кишки

Скрипт небольшой. Мне кажется, что понять его работу будет несложно.
Тем более, что я не поленился и натыкал в тексте скрипта немного комментариев. Думаю, они помогут вам разобраться, как оно работает.


## Обратная связь

Обсудить работу скрипта или как-то повлиять на его функционал, а так же высказать мне всё, что вы думаете по этому поводу, можно в Телеге

[https://t.me/ch32v]

или пишите мне на почту

[zhevak@mail.ru]

